package com.example.simpleforum.util;

/**
 * 密码验证工具类
 * 用于验证密码是否符合复杂度要求
 */
public class PasswordValidator {
    
    /**
     * 验证密码是否符合复杂度要求
     * 密码必须包含大写字母、小写字母、特殊符号和数字中的至少三种
     * 
     * @param password 待验证的密码
     * @return 验证结果，符合要求返回true，否则返回false
     */
    public static boolean isValid(String password) {
        if (password == null || password.length() < 6 || password.length() > 20) {
            return false;
        }
        
        // 检查密码中包含的字符类型数量
        int typesCount = 0;
        
        // 检查是否包含大写字母
        if (containsUpperCase(password)) {
            typesCount++;
        }
        
        // 检查是否包含小写字母
        if (containsLowerCase(password)) {
            typesCount++;
        }
        
        // 检查是否包含数字
        if (containsDigit(password)) {
            typesCount++;
        }
        
        // 检查是否包含特殊字符
        if (containsSpecialChar(password)) {
            typesCount++;
        }
        
        // 至少包含三种类型的字符
        return typesCount >= 3;
    }
    
    /**
     * 获取密码不符合要求的原因
     * 
     * @param password 待验证的密码
     * @return 不符合要求的原因，如果符合要求则返回null
     */
    public static String getInvalidReason(String password) {
        if (password == null) {
            return "密码不能为空";
        }
        
        if (password.length() < 6 || password.length() > 20) {
            return "密码长度必须在6-20个字符之间";
        }
        
        // 检查密码中包含的字符类型数量
        int typesCount = 0;
        boolean hasUpperCase = containsUpperCase(password);
        boolean hasLowerCase = containsLowerCase(password);
        boolean hasDigit = containsDigit(password);
        boolean hasSpecialChar = containsSpecialChar(password);
        
        if (hasUpperCase) typesCount++;
        if (hasLowerCase) typesCount++;
        if (hasDigit) typesCount++;
        if (hasSpecialChar) typesCount++;
        
        if (typesCount < 3) {
            StringBuilder sb = new StringBuilder("密码必须包含以下四种字符中的至少三种：");
            if (!hasUpperCase) sb.append("大写字母、");
            if (!hasLowerCase) sb.append("小写字母、");
            if (!hasDigit) sb.append("数字、");
            if (!hasSpecialChar) sb.append("特殊字符(仅限\"_\",\"@\",\"%\",\".\",\"-\")、");
            
            // 移除最后一个逗号
            if (sb.charAt(sb.length() - 1) == '、') {
                sb.deleteCharAt(sb.length() - 1);
            }
            
            return sb.toString();
        }
        
        return null;
    }
    
    /**
     * 检查密码是否包含大写字母
     */
    private static boolean containsUpperCase(String password) {
        for (char c : password.toCharArray()) {
            if (Character.isUpperCase(c)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 检查密码是否包含小写字母
     */
    private static boolean containsLowerCase(String password) {
        for (char c : password.toCharArray()) {
            if (Character.isLowerCase(c)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 检查密码是否包含数字
     */
    private static boolean containsDigit(String password) {
        for (char c : password.toCharArray()) {
            if (Character.isDigit(c)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 检查密码是否包含特殊字符
     * 特殊字符仅限于: "_", "@", "%", ".", "-"
     */
    private static boolean containsSpecialChar(String password) {
        String specialChars = "_@%.-";
        for (char c : password.toCharArray()) {
            if (specialChars.indexOf(c) != -1) {
                return true;
            }
        }
        return false;
    }
}